function refreshFolderTree(treeObj)
%REFRESHFOLDERTREE 刷新模型文件夹树结构
%   此函数更新GUI树控件以显示当前项目中所有可用的Simulink模型。
%   支持平面列表和层次结构两种显示模式。
%
%语法:
%   refreshFolderTree(treeObj)
%
%输入参数:
%   treeObj - 树控件对象（如uitree对象）
%
%输出参数:
%   无（直接更新树控件）
%
%说明:
%   - 首先调用getModelList()获取所有可用模型
%   - 清除现有的树节点（保留根节点）
%   - 根据配置文件中的ShowModelHierarchy设置选择显示模式：
%     * 层次结构模式：使用sortModelHierarchy()分析模型依赖关系
%     * 平面列表模式：简单的字母排序列表
%   - 递归创建树节点以反映模型层次结构
%   - 自动展开所有节点以提供完整视图
%
%配置依赖:
%   - 依赖prjConfig.json中的ShowModelHierarchy设置
%   - true: 显示基于模型引用的层次结构
%   - false: 显示简单的平面列表
%
%功能特性:
%   - 智能层次结构分析
%   - 动态节点创建
%   - 自动展开功能
%   - 空列表处理
%
%示例:
%   % 在App Designer应用中刷新树
%   refreshFolderTree(app.ModelTree);
%
%   % 在传统GUI中使用
%   h = uitree('Parent', parent_handle);
%   refreshFolderTree(h);
%
%依赖项:
%   getModelList - 获取模型列表
%   decodeUserFile - 解析配置文件
%   sortModelHierarchy - 排序模型层次结构
%   uitreenode - 创建树节点
%   expand - 展开树节点
%
%参见:
%   getModelList, sortModelHierarchy, uitree, uitreenode
%

%版本: 1.0
%日期: 2024
%


modelFolderName = getModelList();

if ~isempty(modelFolderName)
    rootParent = treeObj.Children(1);
    rootParent.Children.delete;

    config = decodeUserFile('prjConfig.json');
    Hierarchy = config.ShowModelHierarchy;

    if Hierarchy
        mdlObjs = sortModelHierarchy(modelFolderName);
        for i = 1:numel(mdlObjs)
            addNode(mdlObjs{i},rootParent)
        end
    else
        for i = 1:numel(modelFolderName)
            mdlName = modelFolderName{i};
            if ~isempty(mdlName)
                uitreenode(rootParent,'Text',mdlName);
            end
        end
    end

    expand(treeObj,'all');
else
    
end

%% supporting functions...
    function addNode(mdlObj,parent)
        modelName = mdlObj.mdlName;
        node = uitreenode(parent,'Text',modelName);
        children = mdlObj.Children;
        if ~isempty(children)
            for j = 1:numel(children)
                addNode(children{j},node);
            end
        end
    end
end